From 4e7a16600bc89c0500be3ae99604e4a70c76d377 Mon Sep 17 00:00:00 2001 From: robertl Date: Sun, 7 Mar 2010 03:51:28 +0000 Subject: [PATCH] From Martin. Added detection of Garmin fitness-specific protocols and data types --- gpsbabel/jeeps/gpsapp.c | 54 ++++++++++++++++++++++++++++++++++++++++ gpsbabel/jeeps/gpsprot.h | 8 ++++++ 2 files changed, 62 insertions(+) diff --git a/gpsbabel/jeeps/gpsapp.c b/gpsbabel/jeeps/gpsapp.c index 0aff1580f..fac1d6891 100644 --- a/gpsbabel/jeeps/gpsapp.c +++ b/gpsbabel/jeeps/gpsapp.c @@ -5,6 +5,7 @@ ** @version 1.0 ** @modified Dec 28 1999 Alan Bleasby. First version ** @modified Copyright (C) 2004, 2005, 2006 Robert Lipe +** @modified Copyright (C) 2007 Achim Schumacher ** @@ ** ** This library is free software; you can redistribute it and/or @@ -252,6 +253,8 @@ static int32 GPS_A000(const char *port) gps_lap_type = -1; gps_run_transfer = -1; gps_run_type = -1; + gps_run_crs_trk_type = -1; + gps_run_crs_trk_hdr_type = -1; gps_workout_transfer = -1; gps_workout_type = -1; gps_workout_occurrence_type = -1; @@ -261,10 +264,13 @@ static int32 GPS_A000(const char *port) gps_workout_limits_type = -1; gps_course_transfer = -1; gps_course_type = -1; + gps_course_lap_transfer = -1; gps_course_lap_type = -1; + gps_course_point_transfer = -1; gps_course_point_type = -1; gps_course_limits_transfer = -1; gps_course_limits_type = -1; + gps_course_trk_transfer = -1; gps_device_command = -1; gps_link_type = -1; @@ -414,6 +420,14 @@ static void GPS_A001(GPS_PPacket packet) break; case 302: gps_trk_transfer = pA302; + /* Use A302 for course track transfer only if we don't + * have another protocol for it yet. This is in accordance + * with the Garmin docs for A1006 which say to use A302 + * in this context only if A1012 is not reported. + */ + if (gps_course_trk_transfer == -1) { + gps_course_trk_transfer = pA302; + } break; case 400: gps_prx_waypt_transfer = pA400; @@ -451,9 +465,18 @@ static void GPS_A001(GPS_PPacket packet) case 1006: gps_course_transfer = pA1006; break; + case 1007: + gps_course_lap_transfer = pA1007; + break; + case 1008: + gps_course_point_transfer = pA1008; + break; case 1009: gps_course_limits_transfer = pA1009; break; + case 1012: + gps_course_trk_transfer = pA1012; + break; } break; @@ -563,6 +586,18 @@ static void GPS_A001(GPS_PPacket packet) case 312: gps_trk_hdr_type = pD312; break; default: GPS_Protocol_Error(tag,data); break; } + if (lasta==302 && gps_course_trk_transfer == pA302) + switch (data) { + case 300: gps_run_crs_trk_type = pD300; break; + case 301: gps_run_crs_trk_type = pD301; break; + case 302: gps_run_crs_trk_type = pD302; break; + case 303: gps_run_crs_trk_type = pD303; break; + case 304: gps_run_crs_trk_type = pD304; break; + case 310: gps_run_crs_trk_hdr_type = pD310; break; + case 311: gps_run_crs_trk_hdr_type = pD311; break; + case 312: gps_run_crs_trk_hdr_type = pD312; break; + default: GPS_Protocol_Error(tag,data); break; + } continue; } @@ -719,6 +754,25 @@ static void GPS_A001(GPS_PPacket packet) gps_course_limits_type = pD1013; continue; } + else if (lasta == 1012) + { + /* We don't know which data types to expect for A1012. For now, + * accept the same ones as for A302 since it is used as a + * replacement for this. + */ + switch (data) { + case 300: gps_run_crs_trk_type = pD300; break; + case 301: gps_run_crs_trk_type = pD301; break; + case 302: gps_run_crs_trk_type = pD302; break; + case 303: gps_run_crs_trk_type = pD303; break; + case 304: gps_run_crs_trk_type = pD304; break; + case 310: gps_run_crs_trk_hdr_type = pD310; break; + case 311: gps_run_crs_trk_hdr_type = pD311; break; + case 312: gps_run_crs_trk_hdr_type = pD312; break; + default: GPS_Protocol_Error(tag,data); break; + } + continue; + } } } diff --git a/gpsbabel/jeeps/gpsprot.h b/gpsbabel/jeeps/gpsprot.h index 09df347eb..95705c90f 100644 --- a/gpsbabel/jeeps/gpsprot.h +++ b/gpsbabel/jeeps/gpsprot.h @@ -184,8 +184,14 @@ int32 gps_user_profile_transfer; int32 gps_workout_limits_transfer; #define pA1006 1006 int32 gps_course_transfer; +#define pA1007 1007 +int32 gps_course_lap_transfer; +#define pA1008 1008 +int32 gps_course_point_transfer; #define pA1009 1009 int32 gps_course_limits_transfer; +#define pA1012 1012 +int32 gps_course_trk_transfer; /* * Waypoint D Type @@ -241,6 +247,7 @@ int32 gps_rte_link_type; #define pD303 303 #define pD304 304 int32 gps_trk_type; +int32 gps_run_crs_trk_type; /* @@ -250,6 +257,7 @@ int32 gps_trk_type; #define pD311 311 #define pD312 312 int32 gps_trk_hdr_type; +int32 gps_run_crs_trk_hdr_type; -- 2.30.2